﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDAL;
using ForrajeriaDB;
using System.Transactions;
using System.Data;

namespace ForrajeriaBCL
{
    public class PedidoClienteBCL : InterfaceBCL<PedidoClienteMO>
    {

        private PedidoClienteDAL pedidoClienteDAL;
        private DetallePedidoClienteDAL detallePedidoClienteDAL;
        private DetallePedidoClienteMO detallePedidoClienteMO = new DetallePedidoClienteMO();


        public PedidoClienteBCL()
        {
            pedidoClienteDAL = PedidoClienteDAL.getInstance;//Llamada al Singleton
            detallePedidoClienteDAL = DetallePedidoClienteDAL.getInstance;
        }

        public string adicionar(PedidoClienteMO objPed, DataTable dt)
        {


            try
            {

                using (TransactionScope tra = new TransactionScope())
                {
                    int numPed = pedidoClienteDAL.AdicionarRetorno(objPed);
                    int cont = 1;
                    foreach (DataRow dr in dt.Rows)
                    {
                        detallePedidoClienteMO.Cantidad = int.Parse(dr["cantidad"].ToString());
                        detallePedidoClienteMO.CodigoForraje = int.Parse(dr["codigoForraje"].ToString());
                        detallePedidoClienteMO.NroDetalle = cont;
                        cont++;
                        detallePedidoClienteMO.Precio = double.Parse(dr["precioTotal"].ToString());
                        detallePedidoClienteMO.NroPedidos = numPed;
                        detallePedidoClienteDAL.Adicionar(detallePedidoClienteMO);

                    }
                    tra.Complete();

                }
                return "1";
            }
            catch
            {
                return "Error Al modificar el Forraje";
            }

        }

        public DataTable obtenerDetalle(int nroPedido)
        {
            try
            {
                DataTable dt = pedidoClienteDAL.obtenerDetalle(nroPedido);
                return dt;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<PedidoClienteMO> getByCliente(int cliente = 0, string estado = "")
        {
            try
            {
                return pedidoClienteDAL.getbyClientIDxEstado(cliente, estado);
            }
            catch
            {
                throw new Exception("Error de Lectura en Base de Datos");
            }


        }


        public List<DetallePedidoClienteMO> getDetallebyPedidoID(int idPedido)
        {
            try
            {
                return detallePedidoClienteDAL.getByNroPedido(idPedido);
            }
            catch
            {
                throw new Exception("Error de Lectura en Base de Datos");
            }

        }


        public DataTable ReportePedidos(string fechaInicio = "", string fechaFin = "", string estado = "0", string columna = "", string dire = "")
        {
            try
            {
                return pedidoClienteDAL.ReportePedidos(fechaInicio, fechaFin, estado, columna, dire);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }


        public DataTable DetalleReporte(int nro)
        {
            try
            {
                return detallePedidoClienteDAL.DetalleReporte(nro);

            }
            catch (Exception ex)
            {
                throw ex;
            }


        }
        #region Interfaz

        public List<PedidoClienteMO> GetAll()
        {
            throw new NotImplementedException();
        }

        public string Adicionar(PedidoClienteMO item)
        {
            throw new NotImplementedException();
        }

        public string Eliminar(PedidoClienteMO item)
        {
            throw new NotImplementedException();
        }

        public string Actualizar(PedidoClienteMO itemNuevo, PedidoClienteMO itemViejo)
        {
            try
            {
                pedidoClienteDAL.Actualizar(itemNuevo, itemViejo);
                return "El pedido se Actualizo Correctamente";

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        public List<PedidoClienteMO> buscarPedidos(string estado, DateTime desde, DateTime hasta)
        {
            try
            {
                return pedidoClienteDAL.buscarPedido(estado,desde,hasta);
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
